package cn.iune.erp.baseinfo;

import java.sql.SQLException;
import java.text.ParseException;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.justep.baas.data.Row;
import com.justep.baas.data.RowState;
import com.justep.baas.data.Table;
import com.justep.baas.data.Transform;


//在此层面（ServiceImpl）统一处理异常，此层面直接被controller调用，面对BizData

@Transactional
@Service
public class FileFactoryServiceImpl implements IFileFactoryService {
	
	private final Logger log = LogManager.getLogger(this);
	
	@Autowired
//	@Resource(name="IFileFactoryDao")
	private IFileFactoryDao dao;
	
//	@Autowired
//	private ISystemCodeService appPreloading;
	
	
	/*
	public FileFactoryUtil(){
		dao = new FileFactoryDaoJPAImpl();
	}
	*/
	/* (non-Javadoc)
	 * @see com.iune.erp.baseinfo.aaa#getAll()
	 */
	@Override
	public List<FileFactory> getAll(){
		return dao.getAll();
	}
	
	/* (non-Javadoc)
	 * @see com.iune.erp.baseinfo.aaa#getByID(java.lang.String)
	 */
	@Override
	public FileFactory getByID(String fID) {
		return dao.getByID(fID);
	}
	
	//获取门店列表
	@Override
//	@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
	public List<FileFactory> getStoreList(String enterpriseNo) {
		return dao.getStoreList(enterpriseNo);
	}
	
	/*
	在@Transaction注解中定义noRollbackFor和RollbackFor指定某种异常是否回滚。 
	@Transactional(noRollbackFor=RuntimeException.class) 
	@Transactional(RollbackFor=Exception.class) 
	*/
	@Transactional
	@Override
	public JSONObject save(JSONObject object) throws ParseException {
		//Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚。 
		//如果一个方法抛出Exception或者Checked异常，Spring事务管理默认不进行回滚。 
		// JSON转换Table
		System.out.println("FileFactoryServiceImpl.save-->>"+object.toJSONString());
		Table table= Transform.jsonToTable(object);
		
		JSONObject data = new JSONObject();
		data.put("concept", table.getTableName());
//		JSONArray rows = new JSONArray();
//		List<String> idsNew = new ArrayList<String>();
//		List<String> idsDel = new ArrayList<String>();
				
		List<Row> list = table.getRows();
		for(Row row : list){
			JSONObject javaObject= Transform.rowToJavaObject(table, row);
			FileFactory obj = JSON.toJavaObject(javaObject, FileFactory.class);
			if(RowState.NEW.equals(obj.getRowState())){
				dao.insert(obj);
//				idsNew.add(obj.getfID());
			}
			if(RowState.DELETE.equals(obj.getRowState())){
				dao.delete(obj.getfID());
//				idsDel.add(obj.getfID());
			}
			if(RowState.EDIT.equals(obj.getRowState())){
				dao.update(obj);
				//返回+1后的version到前台BizData中进行刷新，使得前台的version与后台的一致。
				///////////////////////////////////////////////////////////////////////
//				JSONObject jsonRow = new JSONObject();
//				jsonRow.put("id", obj.getfID());
//				jsonRow.put("version", objNew.getVersion());
//				rows.add(jsonRow);
				//////////////////////////////////////////////////////////////////////
			}
			//测试使用
			/*
			 * 测试结果表明，如果要更新的java对象与数据库中的数据一致，那么merge函数
			 * 被调用之后返回的version和被调用之前的version是相同的，即使merge之后
			 * 使用了flush（）函数也是一样的效果。
			 */
			/*
			if(RowState.NONE.equals(obj.getRowState())){
				FileFactory objNew = dao.update(obj);
				//返回+1后的version到前台BizData中进行刷新，使得前台的version与后台的一致。
				///////////////////////////////////////////////////////////////////////
				FileFactory objQuery = dao.getByID(obj.getfID());
				log.info("update更新后flush（）之后查询出objQuery.getVersion()-->>"+objQuery.getVersion());
				JSONObject jsonRow = new JSONObject();
				jsonRow.put("id", obj.getfID());
				jsonRow.put("version", objQuery.getVersion());
				rows.add(jsonRow);
				//////////////////////////////////////////////////////////////////////
			}
			*/
		}
		
//		data.put("rows", rows);
//		data.put("idsNew", idsNew);
//		data.put("idsDel", idsDel);
		
		data.put("code", 0);
		data.put("msg", "success");
		return data;
	}

	/* (non-Javadoc)
	 * @see com.iune.erp.baseinfo.aaa#delete(java.lang.String)
	 */
	@Transactional
	@Override
	public void delete(String fID) {
		dao.delete(fID);
	}

	/* (non-Javadoc)
	 * @see com.iune.erp.baseinfo.aaa#getByNo(java.lang.String, java.lang.String)
	 */
	@Override
	public FileFactory getByNo(String factoryNo, String enterpriseNo) {
		return dao.getByNo(factoryNo, enterpriseNo);
	}

	/* (non-Javadoc)
	 * @see com.iune.erp.baseinfo.aaa#save(com.alibaba.fastjson.JSONObject)
	 */
	
	/*
	 * 唯一性检查
	 * 返回值：通过检查（唯一），true；否则返回false
	 * 为saveData函数服务，做为保存前的数据唯一性验证
	 */
	@Override
	public JSONObject validData(JSONObject param) {
		System.out.println(this.getClass().getName()+".validData-->>"+param);
		JSONObject row = param.getJSONObject("row");
		System.out.println("validData.param.row-->>"+row);
		String enterpriseNo = row.getJSONObject("enterpriseNo").getString("value");

		String column = param.getString("column");
		System.out.println("validData.param.column-->>"+column);
		
		JSONObject userdata = row.getJSONObject("userdata");
		Object rowState = userdata.get("recordState");
		System.out.println("rowState-->>"+rowState);

		JSONObject data = new JSONObject();
		
		if("factoryNo".equals(column)) {
			String factoryNo = row.getJSONObject("factoryNo").getString("value");
			FileFactory obj = dao.getByNo(factoryNo, enterpriseNo);
			if(RowState.NEW.equals(rowState)){
				//新增
				if(obj==null) {
					//不存在
					data.put("invalid", 0);
					data.put("invalidMsg", "验证通过！");
				}else {
					//已经存在
					data.put("invalid", 1);
					data.put("invalidMsg", "已经存在！");
				}
			}else{
				//修改
				if(obj==null) {
					//不存在
					data.put("invalid", 0);
					data.put("invalidMsg", "验证通过！");
				}else {
					//判是否为自身
					String fID = row.getJSONObject("fID").getString("value");
					//log.info("fID-->>"+fID);
					if(obj.getfID().equals(fID)) {
						//是自身，通过
						//不存在
						data.put("invalid", 0);
						data.put("invalidMsg", "验证通过！");
					}else {
						//不是自身，已经存在
						//已经存在
						data.put("invalid", 1);
						data.put("invalidMsg", "已经存在！");
					}
				}
			}
		}
		
		if("factoryName".equals(column)) {
			String factoryName = row.getJSONObject("factoryNo").getString("value");
			FileFactory obj = dao.getByName(factoryName, enterpriseNo);
			if(RowState.NEW.equals(rowState)){
				//新增
				if(obj==null) {
					//不存在
					data.put("invalid", 0);
					data.put("invalidMsg", "验证通过！");
				}else {
					//已经存在
					data.put("invalid", 1);
					data.put("invalidMsg", "已经存在！");
				}
			}else{
				//修改
				if(obj==null) {
					//不存在
					data.put("invalid", 0);
					data.put("invalidMsg", "验证通过！");
				}else {
					//判是否为自身
					String fID = row.getJSONObject("fID").getString("value");
					//log.info("fID-->>"+fID);
					if(obj.getfID().equals(fID)) {
						//是自身，通过
						//不存在
						data.put("invalid", 0);
						data.put("invalidMsg", "验证通过！");
					}else {
						//不是自身，已经存在
						//已经存在
						data.put("invalid", 1);
						data.put("invalidMsg", "已经存在！");
					}
				}
			}
		}
		
		
		JSONObject json = new JSONObject();
		json.put("code", 0);
		json.put("msg", "success");
		json.put("data", data);

		return json;
	}
	
	@Override
	public JSONObject newData(JSONObject data) {
		return dao.create(data);
	}
	
	@Override
	public JSONObject deleteData(JSONObject param) {
		//System.out.println("fileFactoryCreate.param-->>"+param.toJSONString());
		JSONArray ids = param.getJSONArray("ids");
		for(int i=0;i<ids.size();i++){
			String id = ids.getString(i);
			//这里可以增加是否可删除的判断
			
			dao.delete(id);
		}

		JSONObject data = new JSONObject();
		data.put("ids", ids);
		
		JSONObject json = new JSONObject();
		json.put("code", 0);
		json.put("msg", "success");
		json.put("data", data);
		
		return json;
	}

	/*
	在@Transaction注解中定义noRollbackFor和RollbackFor指定某种异常是否回滚。 
	@Transactional(noRollbackFor=RuntimeException.class) 
	@Transactional(RollbackFor=Exception.class) 
	*/
	@Transactional
	@Override
	public JSONObject saveData(JSONObject param) {
		//Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚。 
		//如果一个方法抛出Exception或者Checked异常，Spring事务管理默认不进行回滚。 
		// JSON转换Table
		//System.out.println(object);
		JSONObject data;
		try {
			data = this.save(param);
					
			JSONObject json = new JSONObject();
			json.put("code", 0);
			json.put("msg", "success");
			json.put("data", data);
			
			return json;
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			log.info("开始打印ParseException");
			e.printStackTrace();
			log.info("e.getMessage()-->>"+e.getMessage());
			log.info("完成打印ParseException");
			
			JSONObject json = new JSONObject();
			json.put("code", -1);
			json.put("msg", e.getMessage());
			
			return json;
		} 
	}
	
	
	/* (non-Javadoc)
	 * @see com.iune.erp.baseinfo.aaa#queryJDBC(com.alibaba.fastjson.JSONObject)
	 */
	@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
	@Override
	public JSONObject queryData(JSONObject param){
		//在此层面（ServiceImpl）统一处理异常，此层面直接被controller调用，面对BizData
		
		try {
			JSONObject jsonTable = dao.query(param);
			
			JSONObject json = new JSONObject();
			json.put("code", 0);
			json.put("msg", "success");
			json.put("data", jsonTable);
			
			return json;
		} catch (SQLException e) {
			e.printStackTrace();
			
			JSONObject json = new JSONObject();
			json.put("code", -1);
			json.put("msg", e.getMessage());
			return json;
		}
	}
	
	@Override
	public void beforeInsert(FileFactory obj) {
		/*
		if(obj.getFactoryNo()==null){
			//资产编号为null，产生编号
			String billType = obj.getBillType();
			String enterpriseNo = obj.getEnterpriseNo();
			System.out.println("enterpriseNo-->>"+enterpriseNo);
			String factoryNo = appPreloading.getMaxCode(billType, enterpriseNo);
			obj.setFactoryNo(factoryNo);
			
		}else{
			//判断是否为空格
			String factoryNo = obj.getFactoryNo().trim();
			if("".equals(factoryNo)){
				//资产编号为""，产生编号
				String billType = obj.getBillType();
				String enterpriseNo = obj.getEnterpriseNo();
				factoryNo = appPreloading.getMaxCode(billType, enterpriseNo);
				obj.setFactoryNo(factoryNo);
				
			}else{
				//去掉空格后赋值
				obj.setFactoryNo(factoryNo);
			}
		}
		*/
	}
	
	@Override
	public void afterInsert(FileFactory obj) {
		
	}

	@Override
	public void beforeDelete(String fID) {
		
	}


}
